// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

package strings

import (
	"unsafe"
)

// 克隆返回s的新副本。
// 它保证将s的副本复制到新的分配中，
// 当只保留一个大得多的字符串的小子字符串
// 时，这一点很重要。使用克隆可以帮助这些程序使用更少的内存。当然，由于使用克隆会产生拷贝，
// 过度使用克隆会使程序使用更多内存。
// 通常只应很少使用克隆，并且仅当
// 分析表明需要克隆时使用。
// 对于长度为零的字符串，将返回字符串“”，并且不进行分配。
func Clone(s string) string {
	if len(s) == 0 {
		return ""
	}
	b := make([]byte, len(s))
	copy(b, s)
	return *(*string)(unsafe.Pointer(&b))
}
